package clases;

import java.util.Collection;
import java.util.Date;
import java.util.Random;
import persistencia.PersistenciaInvitaciones;

/**
 *
 * @author JAVA
 */
public class Invitacion {

    // Constante
    public static final int NUM_MAX_DIAS = 30; // Días para que caduque una invitación
    // Atributos
    private String codigo; // Máx 25 caracteres
    private Date fechaEnvio; // Fecha del sistema
    private Date fechaAceptacion; // Máx 30 días
    private Usuario usuarioEmisor;
    private String usuarioReceptorEmail; // Email usuario receptor
    private Usuario usuarioAceptador;
    
    // Enumeraciones
    public enum EstadoInv {

        ENVIADA, ACEPTADA, RECHAZADA
    };

    // Constructores
    public Invitacion() {
        this.codigo = generaCodigo();

        long lAhora = System.currentTimeMillis();
        Date d = new Date(lAhora);
        d.getTime();
        this.fechaEnvio = d;
    }

    public Invitacion(Usuario usuarioEmisor, String usuarioReceptorEmail) {
        this.codigo = generaCodigo();

        long lAhora = System.currentTimeMillis();
        Date d = new Date(lAhora);
        d.getTime();
        this.fechaEnvio = d;

        this.usuarioEmisor = usuarioEmisor;
        this.usuarioReceptorEmail = usuarioReceptorEmail;
    }
   
    public Invitacion(Usuario usuarioEmisor, Usuario nickUsuReceptor,Date fechaEnvio, Date fechaAceptacion){
        this.codigo = generaCodigo();
        this.fechaEnvio = fechaEnvio;
        if (nickUsuReceptor!=null){
                    this.usuarioAceptador = nickUsuReceptor;
        }
        if (fechaAceptacion!=null){
            this.fechaAceptacion = fechaAceptacion;
        }

        this.usuarioEmisor = usuarioEmisor;
        this.usuarioReceptorEmail = nickUsuReceptor.getEmail();
    }
    // Métodos
    /**
     * Devuelve un código aleatorio alfanumérico de 25 caracteres que identifica la invitación
     * @return 
     */
    private String generaCodigo() {
        String codigoGenerado = "";
        codigoGenerado = getCadenaAlfanumAleatoria(25);
        return codigoGenerado;
    }

    /**
     * Método que genera códigos aleatorios
     * 
     * @param longitud Tamaño de la cadena alfanumérica
     * @return 
     */
    private String getCadenaAlfanumAleatoria(int longitud) {
        String cadenaAleatoria = "";
        long milis = new java.util.GregorianCalendar().getTimeInMillis();
        Random r = new Random(milis);
        int i = 0;
        while (i < longitud) {
            char c = (char) r.nextInt(255);
            if ((c >= '0' && c <= '9') || (c >= 'a' && c <= 'z')) {
                cadenaAleatoria += c;
                i++;
            }
        }
        return cadenaAleatoria;
    }

    // Get & Set
    public String getCodigo() {
        return codigo;
    }

    public void setCodigo(String codigo) {
        this.codigo = codigo;
    }

    public Date getFechaAceptacion() {
        return fechaAceptacion;
    }

    public void setFechaAceptacion(Date fechaAceptacion) {
        this.fechaAceptacion = fechaAceptacion;
    }

    public Date getFechaEnvio() {
        return fechaEnvio;
    }

    public void setFechaEnvio(Date fechaEnvio) {
        this.fechaEnvio = fechaEnvio;
    }

    public Usuario getUsuarioAceptador() {
        return usuarioAceptador;
    }

    public void setUsuarioAceptador(Usuario usuarioAceptador) {
        this.usuarioAceptador = usuarioAceptador;
    }

    public Usuario getUsuarioEmisor() {
        return usuarioEmisor;
    }

    public void setUsuarioEmisor(Usuario usuarioEmisor) {
        this.usuarioEmisor = usuarioEmisor;
    }

    public String getUsuarioReceptorEmail() {
        return usuarioReceptorEmail;
    }

    public void setUsuarioReceptorEmail(String usuarioReceptorEmail) {
        this.usuarioReceptorEmail = usuarioReceptorEmail;
    }
    
    //persistencia
    public static boolean existeInvitacion(String emailUsuarioReceptor){
        return PersistenciaInvitaciones.existeInvitacion( emailUsuarioReceptor);       
    }

    public static Collection<Invitacion> obtenerInvitacionesUsuario(String usuario){
        return PersistenciaInvitaciones.obtenerInvitacionesUsuario2(usuario);
    }
    
    public static boolean existeChorizo(String chorizo){
        return PersistenciaInvitaciones.existeChorizo(chorizo);
    }
    
    public static void aceptarInvitacion(String nick, String email){
        PersistenciaInvitaciones.aceptarInvitacion3(nick, email);
    }
}
